package com.test35_代理模式;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLib动态代理机制
 */
public class Demo03_CglibProxy {

    public static void main(String[] args) {
        Message target = new Message();                 // 核心业务对象
        Enhancer enhancer = new Enhancer();             // 代理控制类
        enhancer.setSuperclass(target.getClass());      // 模拟一个公共父类
        enhancer.setCallback(new ServerProxy2(target)); // 配置代理功能
        Message proxy = (Message) enhancer.create();    // 创建代理对象
        System.out.println(proxy.echo("沐言优拓：www.yootk.com"));
    }
}

class Message {     // 不需要使用到接口
    public String echo(String msg) {
        return "【ECHO】" + msg;
    }
}

class ServerProxy2 implements MethodInterceptor {   // 【CGLIB】方法拦截器
    private Object target;  // 真实业务主题对象

    public ServerProxy2(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object returnValue = null;
        try {
            if (this.connect()) {
                returnValue = method.invoke(this.target, objects);  // 反射调用方法
            }
        } finally {
            this.close();
        }
        return returnValue;
    }

    public boolean connect() {
        System.out.println("【代理业务】连接远程服务器，建立消息发送通道。");
        return true;
    }

    public void close() {
        System.out.println("【代理业务】消息发送完毕，关闭远程消息通道。");
    }
}
